package com.wlz.authorization.config;

import com.wlz.authorization.handler.MyAccessDeniedHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

/**
 *  Authorization 授权
 *  方法授权
 *     基于注解的访问控制
 *          Spring Security在方法的权限控制上支持三种类型的注解，JSR-250注解、@Secured注解和支持表达式
 *      的注解。这三种注解默认都是没有启用的，需要通过@EnableGlobalMethodSecurity来进行启用。
 *          这些注解可以写到 Service 接口或方法上，也可以写到 Controller或 Controller 的方法上。通常情况下
 *      都是写在控制器方法上的，控制接口URL是否允许被访问。
 *    2. Secured注解
 *          @Secured是由Spring Security定义的用来支持方法权限控制的注解。它的使用也是需要启用对应的支
 *      持才会生效的。@Secured 是专门用于判断是否具有角色的，能写在方法或类上。参数要以 ROLE_开头。
 *          开启注解 在启动类或者在配置类上添加 @EnableGlobalMethodSecurity(securedEnabled = true)
 */
//@Configuration
//@EnableGlobalMethodSecurity(securedEnabled = true)
//@EnableWebSecurity 基于springboot 可以不用
public class WebSecurityMethodSecuredConfig extends WebSecurityConfigurerAdapter {


    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.formLogin();  //表单登录

        //授权
        http.authorizeRequests()
//                .antMatchers("/admin/demo").permitAll() // 不用认证
                .anyRequest().authenticated();  //  必须认证

        http.exceptionHandling().accessDeniedHandler(new MyAccessDeniedHandler()); // 支持自定义权限受限处理，需要实现 AccessDeniedHandler接口
        http.csrf().disable();//csrf关掉

    }

    @Bean
    public PasswordEncoder passwordEncoder(){
//        return NoOpPasswordEncoder.getInstance();
        return new BCryptPasswordEncoder();
    }


}
